#include "pch.h"
#include "LoggerModel.hpp"




LoggerModel::LoggerModel(QObject* parent, services::provider::const_ptr provider)
	: QAbstractTableModel(parent)
	, m_stream(provider->service<logger::memorystream>())
{
	verify(connect(&m_timer, SIGNAL(timeout()), SLOT(update())));
	m_timer.start(500);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

LoggerModel::~LoggerModel()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




int LoggerModel::rowCount(const QModelIndex& parent) const
{
	if(parent.isValid())
		return 0;

	return m_entries.size();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

int LoggerModel::columnCount(const QModelIndex& parent) const
{
	if(parent.isValid())
		return 0;

	// @see logger::entry
	return 7;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QVariant LoggerModel::headerData(int section, Qt::Orientation orientation, int role) const
{
	if(role != Qt::DisplayRole)
		return QVariant();

	switch(orientation)
	{
	case Qt::Horizontal:
		switch(section)
		{
		case 0:  return "Level";
		case 1:  return "Message";
		case 2:  return "Module";
		case 3:  return "File";
		case 4:  return "Function";
		case 5:  return "Line";
		case 6:  return "Time";
		default: return QVariant();
		}
		break;
	case Qt::Vertical:
		return section;
		break;
	default:
		return QVariant();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QVariant LoggerModel::data(const QModelIndex& index, int role) const
{
	if(role != Qt::DisplayRole)
		return QVariant();

	if(index.row() >= m_entries.size())
		return QVariant();

	const logger::entry& entry = m_entries[index.row()];

	switch(index.column())
	{
	case 0:  return entry.lvl;
	case 1:  return entry.message;
	case 2:  return entry.module;
	case 3:  return entry.file;
	case 4:  return entry.function;
	case 5:  return entry.line;
	case 6:  return QVariant();
	default: return QVariant();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void LoggerModel::update()
{
	auto entries = m_stream->pop_all();

	if(entries.size())
	{
		emit beginInsertRows(QModelIndex(), m_entries.size(), m_entries.size() + entries.size() - 1);

		std::for_each(entries.begin(), entries.end(), [&](const logger::entry& e)
		{
			m_entries << e;
		});

		emit endInsertRows();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
